<?php

// captura de momento al iniciar el proceso
set_time_limit(0);
$tiempo_micro[1]= microtime();
$q_espacios = explode(" ",$tiempo_micro[1]);
$tiempo_[1]= $q_espacios[1]+$q_espacios[0];

$fila = 1;
// variables para indicar las rutas de los archivos de log y datos
$archivo_fuente = "test.csv";
$archivo_log = "test.log";
// matriz para guardar por linea los datos del archivo y comparar los nombres de columna
$campos = array("anno_carga" => "","depto_carga" => "","muni_carga" => "","codigo_dane" => "","codigo_dane_sede" => "","cons_sede" => "","tipo_documento" => "","nro_documento" => "","exp_depto" => "","exp_mun" => "","apellido1" => "","apellido2" => "","nombre1" => "","nombre2" => "","direccion_residencia" => "","tel" => "","res_depto" => "","res_mun" => "","estrato" => "","sisben" => "","fecha_nacimiento" => "","nac_depto" => "","nac_mun" => "","genero" => "","pob_vict_conf" => "","dpto_exp" => "","mun_exp" => "","proviene_sector_priv" => "","proviene_otro_mun" => "","tipo_discapacidad" => "","cap_exc" => "","etnia" => "","res" => "","ins_familiar" => "","tipo_jornada" => "","caracter" => "","especialidad" => "","grado" => "","grupo" => "","metodologia" => "","subsidiado" => "","repitente" => "","nuevo" => "","sit_acad_ano_ant" => "","con_alum_ano_ant" => "","fue_recu" => "","zon_alu" => "","cab_familia" => "","ben_mad_flia" => "","ben_vet_fp" => "","ben_her_nac" => "","id_alumno" => "");
// apertura de archivo
if (($archivo = fopen($archivo_fuente, "r")) !== FALSE) {
    // bucle que recorre cada linea del archivo
    while (($datos = fgetcsv($archivo, 0, ";", "\"")) !== FALSE) {
        // variable que contiene la cantidad de columnas por linea
        $numero = count($datos);
        // matriz para guardar los posibles errores
        $error = array();
        // prefijo para errores por linea
        $pre = "Error en la linea ".$fila." ";
        // revision de la cantidad de columnas con la matriz $campos, por linea ****
        if ($numero == count($campos)){
            $mat = 0;
            // almacenamiento de datos por linea en la matriz $campos
            foreach($campos as $k => $v){
                $campos[$k] = $datos[$mat];
                $mat++;
            }
            // *********** REVISION DE CADA CAMPO SEGUN LA ESTRUCTURA IMPUESTA EN LA MATRIZ $CAMPOS ***************
            // anno_carga        
            if (!preg_match("/^[[:digit:]]{4}+$/", $campos["anno_carga"])){
                $error[] = $pre."columna 1, El formato del año de carga debe ser numerico de 4 digitos sin espacios, no debe estar vacio.\n";
            }
            // depto_carga        
            if (!preg_match("/^[[:digit:]]{1,2}+$/", $campos["depto_carga"])){
                $error[] = $pre."columna 2, El formato del departamento de carga debe ser numerico de 2 digitos sin espacios, no debe estar vacio.\n";
            }
            // muni_carga        
            if (!preg_match("/^[[:digit:]]{1,3}+$/", $campos["muni_carga"])){
                $error[] = $pre."columna 3, El formato del municipio de carga debe ser numerico máximo de 3 digitos sin espacios, no debe estar vacio.\n";
            }
            // codigo_dane
            if (!preg_match("/^[[:digit:]]{12}+$/", $campos["codigo_dane"])){
                $error[] = $pre."columna 4, El formato del codigo dane debe ser numerico de 12 digitos sin espacios, no debe estar vacio.\n";
            }
            // codigo_dane_sede
            if (!preg_match("/^[[:digit:]]{12}+$/", $campos["codigo_dane_sede"])){
                $error[] = $pre."columna 5, El formato del codigo dane de la sede debe ser numerico de 12 digitos sin espacios, no debe estar vacio.\n";
            }
            // cons_sede
            if(trim($campos['cons_sede']) != ""){
                if (!preg_match("/^[[:digit:]]{14}+$/", $campos["cons_sede"])){
                    $error[] = $pre."columna 6, El formato del consecutivo de la sede debe ser numerico de 14 digitos sin espacios, puede estar vacio.\n";
                }
            }
            // tipo_documento
            if (!preg_match("/^[[:digit:]]{1}+$/", $campos["tipo_documento"])){
                $error[] = $pre."columna 7, El formato del tipo de documento debe ser numerico de 1 digito sin espacios, no debe estar vacio.\n";
            }
            // nro_documento
            if (!preg_match("/^[[:alnum:]]{1,45}+$/", $campos["nro_documento"])){
                $error[] = $pre."columna 8, El formato del número de documento debe ser alfanumerico máximo de 45 digitos sin espacios, no debe estar vacio.\n";
            }
            // exp_depto
            if (!preg_match("/^[[:digit:]]{1,2}+$/", $campos["exp_depto"])){
                $error[] = $pre."columna 9, El formato del departamento de expedición del documento debe ser numerico máximo de 2 digitos sin espacios, no debe estar vacio.\n";
            }
            // exp_mun
            if (!preg_match("/^[[:digit:]]{1,3}+$/", $campos["exp_mun"])){
                $error[] = $pre."columna 10, El formato del municipio de expedición del documento debe ser numerico máximo de 3 digitos sin espacios, no debe estar vacio.\n";
            }
            // apellido1
            if (!preg_match("/^[A-Za-záéíóúñÁÉÍÓÚÑ\s]{1,45}+$/", $campos["apellido1"])){
                $error[] = $pre."columna 11, El formato del primer apellido del estudiante debe ser letras máximo de 45 caracteres, no debe estar vacio.\n";
            }
            // apellido2
            if (!preg_match("/^[A-Za-záéíóúñÁÉÍÓÚÑ\s]{1,45}+$/", $campos["apellido2"])){
                $error[] = $pre."columna 12, El formato del segundo apellido del estudiante debe ser letras máximo de 45 caracteres, no debe estar vacio.\n";
            }
            // nombre1
            if (!preg_match("/^[A-Za-záéíóúñÁÉÍÓÚÑ\s]{1,45}+$/", $campos["nombre1"])){
                $error[] = $pre."columna 13, El formato del primer nombre del estudiante debe ser letras máximo de 45 caracteres, no debe estar vacio.\n";
            }
            // nombre2
            if(trim($campos['nombre2']) != ""){
                if (!preg_match("/^[A-Za-záéíóúñÁÉÍÓÚÑ\s]{1,45}+$/", $campos["nombre2"])){
                    $error[] = $pre."columna 14, El formato del segundo nombre del estudiante debe ser letras máximo de 45 caracteres, puede estar vacio.\n";
                }
            }
            // direccion_residencia
            if (strlen(trim($campos['direccion_residencia'])) == 0 || strlen(trim($campos['direccion_residencia'])) > 100){
                $error[] = $pre."columna 15, El formato de la dirección de residencia del estudiante debe ser máximo de 100 caracteres alfanumericos, no debe estar vacio.\n";
            }
            // tel
            if(trim($campos['tel']) != ""){
                if (!preg_match("/^[[:alnum:]]{1,50}+$/", $campos["tel"])){
                    $error[] = $pre."columna 16, El formato del telefono del estudiante es alfanumerico máximo de 50 caracteres, puede estar vacio.\n";
                }
            }
            // res_depto
            if (!preg_match("/^[[:digit:]]{1,2}+$/", $campos["res_depto"])){
                $error[] = $pre."columna 17, El formato del departamento de residencia del estudiante debe ser numerico máximo de 2 digitos sin espacios, no debe estar vacio.\n";
            }
            // res_mun
            if (!preg_match("/^[[:digit:]]{1,3}+$/", $campos["res_mun"])){
                $error[] = $pre."columna 18, El formato del municipio de residencia del estudiante debe ser numerico máximo de 3 digitos sin espacios, no debe estar vacio.\n";
            }
            // estrato
            if (!preg_match("/^[[:digit:]]{1}+$/", $campos["estrato"])){
                $error[] = $pre."columna 19, El formato del estrato del estudiante debe ser numerico máximo 1 digito sin espacios, no debe estar vacio.\n";
            }
            // sisben
            if (!preg_match("/^[[:digit:]]{1}+$/", $campos["sisben"])){
                $error[] = $pre."columna 20, El formato del sisben del estudiante debe ser numerico máximo de 1 digito, no debe estar vacio.\n";
            }
            // fecha_nacimiento
            if(trim($campos['fecha_nacimiento']) != ""){
                if(!preg_match("/^([1-9]|[012][1-9]|3[01])-([1-9]|0[1-9]|1[012])-(19[6-9][0-9]|200[0-5])$/", $campos['fecha_nacimiento'])) {
                    $error[] = $pre."columna 21, El formato de la fecha de nacimiento del estudiante debe ser DD-MM-AAAA o D-M-AAAA sin espacios y el rango de años esta entre 1960 y 2005, puede estar vacio.\n";
                }
            }
            // nac_depto
            if (!preg_match("/^[[:digit:]]{1,2}+$/", $campos["nac_depto"])){
                $error[] = $pre."columna 22, El formato del departamento de nacimiento del estudiante debe ser numerico máximo de 2 digitos sin espacios, no debe estar vacio.\n";
            }
            // nac_mun
            if (!preg_match("/^[[:digit:]]{1,3}+$/", $campos["nac_mun"])){
                $error[] = $pre."columna 23, El formato del municipio de nacimiento del estudiante debe ser numerico máximo de 3 digitos sin espacios, no debe estar vacio.\n";
            }
            // genero
            if (!preg_match("/^[MFmf]{1}+$/", $campos["genero"])){
                $error[] = $pre."columna 24, El formato del genero del estudiante debe ser M o F solo acepta un caracter sin espacios, no debe estar vacio.\n";
            }
            // pob_vict_conf
            if(trim($campos['pob_vict_conf']) != ""){
                if (!preg_match("/^[[:digit:]]{1}+$/", $campos["pob_vict_conf"])){
                    $error[] = $pre."columna 25, El formato de poblacion victima del conflicto debe ser numerico de 1 digito sin espacios, puede estar vacio.\n";
                }
                // dpto_expul
                if (!preg_match("/^[[:digit:]]{1,2}+$/", $campos["dpto_exp"])){
                    $error[] = $pre."columna 26, El formato del departamento de expulsión debe ser numerico máximo de 2 digitos, puede estar vacio siempre y cuando poblacion victima del conflicto este vacio.\n";
                }
                // mun_expul
                if (!preg_match("/^[[:digit:]]{1,3}+$/", $campos["mun_exp"])){
                    $error[] = $pre."columna 27, El formato del municipio de expulsión debe ser numerico máximo de 3 digitos, puede estar vacio siempre y cuando poblacion victima del conflicto este vacio.\n";
                }
            }
            // proviene_sector_priv
            if(trim($campos['proviene_sector_priv']) != ""){
                if (!preg_match("/^[SNsn]{1}+$/", $campos["proviene_sector_priv"])){
                    $error[] = $pre."columna 28, El formato de sector privado debe ser S o N solo acepta un caracter sin espacios, puede estar vacio.\n";
                }
            }
            // proviene_otro_mun
            if(trim($campos['proviene_otro_mun']) != ""){
                if (!preg_match("/^[SNsn]{1}+$/", $campos["proviene_otro_mun"])){
                    $error[] = $pre."columna 29, El formato de proveniente de otro municipio debe ser S o N solo acepta un caracter sin espacios, puede estar vacio.\n";
                }
            }
            // tipo_discapacidad
            if(trim($campos['tipo_discapacidad']) != ""){
                if (!preg_match("/^[[:digit:]]{1,2}+$/", $campos["proviene_otro_mun"])){
                    $error[] = $pre."columna 30, El formato del tipo de discapacidad debe ser numerico maximo de 2 digitos sin espacios, puede estar vacio.\n";
                }
            }
            // cap_exc
            if(trim($campos['cap_exc']) != ""){
                if (!preg_match("/^[[:digit:]]{1}+$/", $campos["cap_exc"])){
                    $error[] = $pre."columna 31, El formato de capacidad excepcional debe ser numerico de 1 digito sin espacios, puede estar vacio.\n";
                }
            }
            // etnia
            if(trim($campos['etnia']) != ""){
                if (!preg_match("/^[[:digit:]]{1,3}+$/", $campos["etnia"])){
                    $error[] = $pre."columna 32, El formato del grupo etnico debe ser numerico maximo de 3 digitos sin espacios, puede estar vacio.\n";
                }
            }
            // res
            if(trim($campos['res']) != ""){
                if (!preg_match("/^[[:digit:]]{1,3}+$/", $campos["res"])){
                    $error[] = $pre."columna 33, El formato del resguardo debe ser numerico maximo de 3 digitos sin espacios, puede estar vacio.\n";
                }
            }
            // ins_familiar
            if(trim($campos['ins_familiar']) != ""){
                if (strlen(trim($campos['ins_familiar'])) > 100){
                    $error[] = $pre."columna 34, El formato de la institución bienestar de origen debe ser maximo de 100 caracteres, puede estar vacio.\n";
                }
            }
            // tipo_jornada
            if (!preg_match("/^[[:digit:]]{1}+$/", $campos["tipo_jornada"])){
                $error[] = $pre."columna 35, El formato del tipo de jornada debe ser numerico de 1 digito sin espacios, no debe estar vacio.\n";
            }
            // caracter
            if(trim($campos['caracter']) != ""){
                if (!preg_match("/^[[:digit:]]{1}+$/", $campos["caracter"])){
                    $error[] = $pre."columna 36, El formato del carácter debe ser numerico de 1 digito sin espacios, puede estar vacio.\n";
                }
            }
            // especialidad
            if(trim($campos['especialidad']) != ""){
                if (!preg_match("/^[[::digit::]]{1}+$/", $campos["especialidad"])){
                    $error[] = $pre."columna 37, El formato de la especialidad debe ser numerico de 1 digito sin espacios, puede estar vacio.\n";
                }
            }
            // grado
            if (!preg_match("/^[[:digit:]-]{1,2}+$/", $campos["grado"])){
                $error[] = $pre."columna 38, El formato del grado debe ser numerico de maximo 2 digitos sin espacios, no debe estar vacio.\n";
            }
            // grupo
            if(trim($campos['grupo']) != ""){
                if (!preg_match("/^[[:alnum:]]{1,3}+$/", $campos["grupo"])){
                    $error[] = $pre."columna 39, El formato del grupo puede ser alfanumerico de maximo 3 caracteres sin espacios, puede estar vacio.\n";
                }
            }
            // metodologia
            if(trim($campos['metodologia']) != ""){
                if (!preg_match("/^[[:digit:]]{1,2}+$/", $campos["metodologia"])){
                    $error[] = $pre."columna 40, El formato de la metodologia es numerico maximo de 2 digitos sin espacios, puede estar vacio.\n";
                }
            }
            // subisidiado
            if(trim($campos['subsidiado']) != ""){
                if (!preg_match("/^[SNsn]{1}+$/", $campos["subsidiado"])){
                    $error[] = $pre."columna 41, El formato del subsidio solo acepta una de las siguientes opciones S o N sin espacios, puede estar vacio.\n";
                }
            }
            // repitente
            if(trim($campos['repitente']) != ""){
                if (!preg_match("/^[SNsn]{1}+$/", $campos["repitente"])){
                    $error[] = $pre."columna 42, El formato del repitente solo acepta una de las siguientes opciones S o N sin espacios, puede estar vacio.\n";
                }
            }
            // nuevo
            if(trim($campos['nuevo']) != ""){
                if (!preg_match("/^[SNsn]{1}+$/", $campos["nuevo"])){
                    $error[] = $pre."columna 43, El formato de nuevo solo acepta una de las siguientes opciones S o N sin espacios, puede estar vacio.\n";
                }
            }
            // sit_acad_ano_ant
            if(trim($campos['sit_acad_ano_ant']) != ""){
                if (!preg_match("/^[[:digit:]]{1}+$/", $campos["sit_acad_ano_ant"])){
                    $error[] = $pre."columna 44, El formato de situación académica del año anterior debe ser numerico de 1 digito sin espacios, puede estar vacio.\n";
                }
            }
            // con_alum_ano_ant
            if(trim($campos['con_alum_ano_ant']) != ""){
                if (!preg_match("/^[[:digit:]]{1,4}+$/", $campos["con_alum_ano_ant"])){
                    $error[] = $pre."columna 45, El formato de la condición del año anterior debe ser numerico de 1 digito sin espacios, puede estar vacio.\n";
                }
            }
            // fue_recu
            if(trim($campos['fue_recu']) != ""){
                if (!preg_match("/^[[:digit:]]{1}+$/", $campos["fue_recu"])){
                    $error[] = $pre."columna 46, El formato de la fuente de recursos debe ser numerico de 1 digito sin espacios, puede estar vacio.\n";
                }
            }
            // zona_alu
            if(trim($campos['zona_alu']) != ""){
                if (!preg_match("/^[[:digit:]]{1}+$/", $campos["zona_alu"])){
                    $error[] = $pre."columna 47, El formato de la zona en que reside el alumno debe ser numerico de 1 digito sin espacios, puede estar vacio.\n";
                }
            }
            // cab_familia
            if(trim($campos['cab_familia']) != ""){
                if (!preg_match("/^[SNsn]{1}+$/", $campos["cab_familia"])){
                    $error[] = $pre."columna 48, El formato de alumno madre cabeza de familia solo acepta una de las siguientes opciones S o N sin espacios, puede estar vacio.\n";
                }
            }
            // ben_mad_flia
            if(trim($campos['ben_mad_flia']) != ""){
                if (!preg_match("/^[SNsn]{1}+$/", $campos["ben_mad_flia"])){
                    $error[] = $pre."columna 49, El formato de Beneficiario Hijos dependientes de Madre Cabeza de Familia solo acepta una de las siguientes opciones S o N sin espacios, puede estar vacio.\n";
                }
            }
            // ben_vet_fp
            if(trim($campos['ben_vet_fp']) != ""){
                if (!preg_match("/^[SNsn]{1}+$/", $campos["ben_vet_fp"])){
                    $error[] = $pre."columna 50, El formato de Beneficiario Veteranos de la Fuerza Pública solo acepta una de las siguientes opciones S o N sin espacios, puede estar vacio.\n";
                }
            }
            // ben_her_nac
            if(trim($campos['ben_her_nac']) != ""){
                if (!preg_match("/^[SNsn]{1}+$/", $campos["ben_her_nac"])){
                    $error[] = $pre."columna 51, El formato de Beneficiario Héroes de la Nación solo acepta una de las siguientes opciones S o N sin espacios, puede estar vacio.\n";
                }
            }
            // id_alumno
            //if(trim($campos['id_alumno']) != ""){
            //    if (!preg_match("/^[A-Za-zñÑáéíóúÁÉÍÓÚ0-9\s]{1,20}+$/", $campos["id_alumno"])){
            //        $error[] = $pre."columna 52, El formato del id del alumno puede ser alfanumerico maximo 20 caracteres, puede estar vacio.\n";
            //    }
            //}
        } else {
            $error[] = $pre . "el número de columnas no coincide con el formato exigido.";
        }
        // escritura de errores en el archivo log
        if (count($error) > 0) {
            if ($log = fopen($archivo_log, "a") != FALSE) {
                foreach($error as $valor) {
                    fputs($log, $valor);
                }
                fclose($log);
            }
        }
        // aumento de linea
        $fila++;
    }
    // cierre del archivo csv
    fclose($archivo);
// accion a tomar en caso de que no se encuentre el archivo o no se pueda abrir
} else {
    if ($log = fopen($archivo_log, "a") != FALSE) {
        fputs($log, "No se puede abrir el archivo, por favor contactese con el administrador o revise si el archivo de datos fue adjuntado.\n");
        fclose($log);
    }
}

// captura de momento al finalizar el proceso
$tiempo_micro[2] = microtime();
$q_espacios= explode(" ",$tiempo_micro[2]);
$tiempo_[2] =$q_espacios[1] + $q_espacios[0];
$tiempo_utilizado = number_format(($tiempo_[2] - $tiempo_[1]),3, "." ,",");

// mensaje mostrando el tiempo transcurrido segun las capturas de inicio y fin del procedimiento
$t = number_format(($tiempo_utilizado*0.0166666667), 3, ".", ",") . " minutos transcurridos en la operación de validación.\n";
if ($log = fopen($archivo_log, "a") != FALSE) {
    fputs($log, $t);
    fclose($log);
}

?>